var http = require('http');

//https是一个安全的http，在传输数据时可以对数据进行加密
//两个协议的使用方法一致
var https = require('https');

//cheerio是node上类似jQuery的可以操作html的类库
var cheerio = require('cheerio');

//爬虫爬的是https://www.lagou.com/拉勾网的menu
//menu有三级菜单，只抓一级和二级
var url = 'https://www.lagou.com/';

var filterMenu = function (html) {
    //将字符串转换为cheerio对象
    var $ = cheerio.load(html);
    //获取menu_main菜单对象
    var menu = $('.menu_main');
    //menuData用来存储一级标题与二级标题
    var menuData = [];
    //menu.each对象的循环方法
    menu.each(function (index, value) {
        //value返回的是一个javascript对象，$(value）封装成为一个cheerio对象
        //存储一级标题
        var menuTitle = $(value).find('h2').text();
        var menuLists = $(value).find('a');
        //存储二级标题
        var menuList = [];
        menuLists.each(function (index, value) {
            //push的是a元素里面的值
            menuList.push($(value).text());
        })
        //整个数组的装载
        menuData.push({
            menuTitle: menuTitle,
            menuList: menuList
        })
    })
    //返回一级与二级标题的数组
    return menuData;
}

//传入的参数是menu的数组
var printMenu = function (menu) {

    // Array.prototype.forEach = function(callback,thisArg) {};
    // 参数
    //  callback
    //    为数组中每个元素执行的函数，该函数接收三个参数：
    //    currentValue
    //       数组中正在处理的当前元素。
    //    index可选
    //       数组中正在处理的当前元素的索引。
    //    array可选
    //       forEach()方法正在操作的数组。
    //  thisArg可选
    //       可选参数。当执行回调函数时用作this的值(参考对象)。
    // 返回值
    //     undefined.
    //使用 thisArgs ：可以是外部对象或者this
//     function Counter() {
//         this.sum = 0;
//         this.count = 0;
//     }
//
//     Counter.prototype.add = function(array) {
//         array.forEach(function(entry) {
//             this.sum += entry;
//             ++this.count;
//         }, this);
//         //console.log(this);
//     };
//
//     var obj = new Counter();
//     obj.add([1, 3, 5, 7]);
//
//     obj.count;
// // 4 === (1+1+1+1)
//     obj.sum;
// // 16 === (1+3+5+7)


    //数组的遍历，menu.forEach
    //传入的参数是遍历的item
    //\n newRow折行处理
    menu.forEach(function (value) {
        //打印一级标题
        console.log(value.menuTitle + '\n');
        //打印二级标题数组
        value.menuList.forEach(function (value) {
            console.log(value);
        })
    })
}

//http协议，所以引入https模块
// _http_client.js:131
// throw new Error('Protocol "' + protocol + '" not supported. ' +
//     ^
//     Error: Protocol "https:" not supported. Expected "http:"
// at new ClientRequest (_http_client.js:131:11)
// at request (http.js:38:10)
// at Object.get (http.js:42:13)
// at Object.<anonymous> (D:\TTS9\workspace\nodeJS\nodejs-day1-1\spider.js:11:6
// )
// at Module._compile (module.js:635:30)
// at Object.Module._extensions..js (module.js:646:10)
// at Module.load (module.js:554:32)
// at tryModuleLoad (module.js:497:12)
// at Function.Module._load (module.js:489:3)
// at Function.Module.runMain (module.js:676:10)

//get后面多写了个等号，测试没有结果
//get方法获取的是静态网页
//想获取异步的ajax请求或者具有异步的接口的返回数据，得采用request
https.get(url, function (res) {
    var html = '';

    //抓取的是拉勾网的网页html页面的源代码
    res.on('data', function (data) {
        html += data;
    })

    res.on('end', function () {
        // console.log(html);
        var result = filterMenu(html);
        printMenu(result);
    })

    res.on('error', function (err) {
        console.log(err);
    })
});